--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit 606a723e315faf404a5da4bc42cbe565dd4af8a1
Parents : a44c1f3
Author : Mark Qvist <mark@unsigned.io>
Date : 2025-10-31T17:11:17+01:00
Implemented getting static peer configuration from network if unknown at launch
Changes
2 files changed, 43 insertions(+), 51 deletions(-)
Diff
diff --git a/LXMF/Handlers.py b/LXMF/Handlers.py
index f55cc76..a65978c 100644
--- a/LXMF/Handlers.py
+++ b/LXMF/Handlers.py
@@ -39,22 +39,23 @@ class LXMFPropagationAnnounceHandler:
self.lxmrouter = lxmrouter
def received_announce(self, destination_hash, announced_identity, app_data, announce_packet_hash, is_path_response):
- if not is_path_response:
- try:
- if type(app_data) == bytes:
- if self.lxmrouter.propagation_node:
- data = msgpack.unpackb(app_data)
- if pn_announce_data_is_valid(data):
- node_timebase = int(data[1])
- propagation_enabled = data[2]
- propagation_transfer_limit = int(data[3])
- propagation_sync_limit = int(data[4])
- propagation_stamp_cost = int(data[5][0])
- propagation_stamp_cost_flexibility = int(data[5][1])
- peering_cost = int(data[5][2])
- metadata = data[6]
-
- if destination_hash in self.lxmrouter.static_peers:
+ try:
+ if type(app_data) == bytes:
+ if self.lxmrouter.propagation_node:
+ data = msgpack.unpackb(app_data)
+ if pn_announce_data_is_valid(data):
+ node_timebase = int(data[1])
+ propagation_enabled = data[2]
+ propagation_transfer_limit = int(data[3])
+ propagation_sync_limit = int(data[4])
+ propagation_stamp_cost = int(data[5][0])
+ propagation_stamp_cost_flexibility = int(data[5][1])
+ peering_cost = int(data[5][2])
+ metadata = data[6]
+
+ if destination_hash in self.lxmrouter.static_peers:
+ static_peer = self.lxmrouter.static_peers[destination_hash]
+ if not is_path_response or static_peer.last_heard == 0:
self.lxmrouter.peer(destination_hash=destination_hash,
timestamp=node_timebase,
propagation_transfer_limit=propagation_transfer_limit,
@@ -64,27 +65,27 @@ class LXMFPropagationAnnounceHandler:
peering_cost=peering_cost,
metadata=metadata)
- else:
- if self.lxmrouter.autopeer:
- if propagation_enabled == True:
- if RNS.Transport.hops_to(destination_hash) <= self.lxmrouter.autopeer_maxdepth:
- self.lxmrouter.peer(destination_hash=destination_hash,
- timestamp=node_timebase,
- propagation_transfer_limit=propagation_transfer_limit,
- propagation_sync_limit=propagation_sync_limit,
- propagation_stamp_cost=propagation_stamp_cost,
- propagation_stamp_cost_flexibility=propagation_stamp_cost_flexibility,
- peering_cost=peering_cost,
- metadata=metadata)
+ else:
+ if self.lxmrouter.autopeer and not is_path_response:
+ if propagation_enabled == True:
+ if RNS.Transport.hops_to(destination_hash) <= self.lxmrouter.autopeer_maxdepth:
+ self.lxmrouter.peer(destination_hash=destination_hash,
+ timestamp=node_timebase,
+ propagation_transfer_limit=propagation_transfer_limit,
+ propagation_sync_limit=propagation_sync_limit,
+ propagation_stamp_cost=propagation_stamp_cost,
+ propagation_stamp_cost_flexibility=propagation_stamp_cost_flexibility,
+ peering_cost=peering_cost,
+ metadata=metadata)
- else:
- if destination_hash in self.lxmrouter.peers:
- RNS.log(f"Peer {self.lxmrouter.peers[destination_hash]} moved outside auto-peering range, breaking peering...")
- self.lxmrouter.unpeer(destination_hash, node_timebase)
+ else:
+ if destination_hash in self.lxmrouter.peers:
+ RNS.log(f"Peer {self.lxmrouter.peers[destination_hash]} moved outside auto-peering range, breaking peering...")
+ self.lxmrouter.unpeer(destination_hash, node_timebase)
- elif propagation_enabled == False:
- self.lxmrouter.unpeer(destination_hash, node_timebase)
+ elif propagation_enabled == False:
+ self.lxmrouter.unpeer(destination_hash, node_timebase)
- except Exception as e:
- RNS.log("Error while evaluating propagation node announce, ignoring announce.", RNS.LOG_DEBUG)
- RNS.log(f"The contained exception was: {str(e)}", RNS.LOG_DEBUG)
+ except Exception as e:
+ RNS.log("Error while evaluating propagation node announce, ignoring announce.", RNS.LOG_DEBUG)
+ RNS.log(f"The contained exception was: {str(e)}", RNS.LOG_DEBUG)
diff --git a/LXMF/LXMRouter.py b/LXMF/LXMRouter.py
index bac498b..798cd5a 100644
--- a/LXMF/LXMRouter.py
+++ b/LXMF/LXMRouter.py
@@ -540,9 +540,6 @@ class LXMRouter:
peer = LXMPeer.from_bytes(serialised_peer, self)
del serialised_peer
if peer.destination_hash in self.static_peers and peer.last_heard == 0:
- # TODO: Allow path request responses through announce handler
- # momentarily here, so peering config can be updated even if
- # the static peer is not available to directly send an announce.
RNS.Transport.request_path(peer.destination_hash)
if peer.identity != None:
self.peers[peer.destination_hash] = peer
@@ -2012,14 +2009,11 @@ class LXMRouter:
try:
if packet.destination_type != RNS.Destination.LINK: return
else:
- data = msgpack.unpackb(data)
- remote_timebase = data[0]
- messages = data[1]
-
- #######################################
- # TODO: Check propagation stamps here #
- #######################################
- min_accepted_cost = max(0, self.propagation_stamp_cost-self.propagation_stamp_cost_flexibility)
+ data = msgpack.unpackb(data)
+ remote_timebase = data[0]
+ messages = data[1]
+
+ min_accepted_cost = max(0, self.propagation_stamp_cost-self.propagation_stamp_cost_flexibility)
validated_messages = LXStamper.validate_pn_stamps(messages, min_accepted_cost)
for validated_entry in validated_messages:
@@ -2119,9 +2113,6 @@ class LXMRouter:
ms = "" if len(messages) == 1 else "s"
RNS.log(f"Received {len(messages)} message{ms} from {remote_str}", RNS.LOG_VERBOSE)
- #######################################
- # TODO: Check propagation stamps here #
- #######################################
min_accepted_cost = max(0, self.propagation_stamp_cost-self.propagation_stamp_cost_flexibility)
validated_messages = LXStamper.validate_pn_stamps(messages, min_accepted_cost)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────